{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1 读取数据\n",
    "dataset = pd.read_csv(\"Breast_cancer_data.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(569, 6)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_radius</th>\n",
       "      <th>mean_texture</th>\n",
       "      <th>mean_perimeter</th>\n",
       "      <th>mean_area</th>\n",
       "      <th>mean_smoothness</th>\n",
       "      <th>diagnosis</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean_radius  mean_texture  mean_perimeter  mean_area  mean_smoothness  \\\n",
       "0        17.99         10.38          122.80     1001.0          0.11840   \n",
       "1        20.57         17.77          132.90     1326.0          0.08474   \n",
       "2        19.69         21.25          130.00     1203.0          0.10960   \n",
       "3        11.42         20.38           77.58      386.1          0.14250   \n",
       "4        20.29         14.34          135.10     1297.0          0.10030   \n",
       "\n",
       "   diagnosis  \n",
       "0          0  \n",
       "1          0  \n",
       "2          0  \n",
       "3          0  \n",
       "4          0  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 2 数据EDA\n",
    "\n",
    "dataset.head() # 默认显示前5行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 569 entries, 0 to 568\n",
      "Data columns (total 6 columns):\n",
      " #   Column           Non-Null Count  Dtype  \n",
      "---  ------           --------------  -----  \n",
      " 0   mean_radius      569 non-null    float64\n",
      " 1   mean_texture     569 non-null    float64\n",
      " 2   mean_perimeter   569 non-null    float64\n",
      " 3   mean_area        569 non-null    float64\n",
      " 4   mean_smoothness  569 non-null    float64\n",
      " 5   diagnosis        569 non-null    int64  \n",
      "dtypes: float64(5), int64(1)\n",
      "memory usage: 26.8 KB\n"
     ]
    }
   ],
   "source": [
    "dataset.info() # 查看数据信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_radius</th>\n",
       "      <th>mean_texture</th>\n",
       "      <th>mean_perimeter</th>\n",
       "      <th>mean_area</th>\n",
       "      <th>mean_smoothness</th>\n",
       "      <th>diagnosis</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>14.127292</td>\n",
       "      <td>19.289649</td>\n",
       "      <td>91.969033</td>\n",
       "      <td>654.889104</td>\n",
       "      <td>0.096360</td>\n",
       "      <td>0.627417</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.524049</td>\n",
       "      <td>4.301036</td>\n",
       "      <td>24.298981</td>\n",
       "      <td>351.914129</td>\n",
       "      <td>0.014064</td>\n",
       "      <td>0.483918</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>6.981000</td>\n",
       "      <td>9.710000</td>\n",
       "      <td>43.790000</td>\n",
       "      <td>143.500000</td>\n",
       "      <td>0.052630</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>11.700000</td>\n",
       "      <td>16.170000</td>\n",
       "      <td>75.170000</td>\n",
       "      <td>420.300000</td>\n",
       "      <td>0.086370</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>13.370000</td>\n",
       "      <td>18.840000</td>\n",
       "      <td>86.240000</td>\n",
       "      <td>551.100000</td>\n",
       "      <td>0.095870</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>15.780000</td>\n",
       "      <td>21.800000</td>\n",
       "      <td>104.100000</td>\n",
       "      <td>782.700000</td>\n",
       "      <td>0.105300</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>28.110000</td>\n",
       "      <td>39.280000</td>\n",
       "      <td>188.500000</td>\n",
       "      <td>2501.000000</td>\n",
       "      <td>0.163400</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       mean_radius  mean_texture  mean_perimeter    mean_area  \\\n",
       "count   569.000000    569.000000      569.000000   569.000000   \n",
       "mean     14.127292     19.289649       91.969033   654.889104   \n",
       "std       3.524049      4.301036       24.298981   351.914129   \n",
       "min       6.981000      9.710000       43.790000   143.500000   \n",
       "25%      11.700000     16.170000       75.170000   420.300000   \n",
       "50%      13.370000     18.840000       86.240000   551.100000   \n",
       "75%      15.780000     21.800000      104.100000   782.700000   \n",
       "max      28.110000     39.280000      188.500000  2501.000000   \n",
       "\n",
       "       mean_smoothness   diagnosis  \n",
       "count       569.000000  569.000000  \n",
       "mean          0.096360    0.627417  \n",
       "std           0.014064    0.483918  \n",
       "min           0.052630    0.000000  \n",
       "25%           0.086370    0.000000  \n",
       "50%           0.095870    1.000000  \n",
       "75%           0.105300    1.000000  \n",
       "max           0.163400    1.000000  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.describe() # 查看数据描述"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    357\n",
       "0    212\n",
       "Name: diagnosis, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据标签diagnosis统计数据\n",
    "dataset['diagnosis'].value_counts() # 1 阳性，0 阴性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 3 特征工程\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 特征 ，标签\n",
    "X = dataset.drop('diagnosis', axis=1)\n",
    "y = dataset['diagnosis']\n",
    "\n",
    "# 数据集split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X.values, y.values, test_size=0.2, random_state=666)\n",
    "\n",
    "# 数据归一化\n",
    "sc = StandardScaler() # 将所有数据归一到均值为0，方差为1\n",
    "sc.fit(X_train, y_train) # 拟合\n",
    "\n",
    "X_train_scaler = sc.transform(X_train) # 归一化\n",
    "X_test_scaler = sc.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4 模型训练\n",
    "import lightgbm as lgb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = lgb.LGBMClassifier() # 基模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMClassifier()"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 情况1：基于X_train, y_train训练\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 情况2：基于X_train_scaler, y_train训练\n",
    "model_2 = lgb.LGBMClassifier() # 基模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMClassifier()"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_2.fit(X_train_scaler, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 5 模型预测\n",
    "\n",
    "# 模型1\n",
    "y_pred_1 = model.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 模型2\n",
    "y_pred_2 = model_2.predict(X_test_scaler)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9385964912280702"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 6 模型评估\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "\n",
    "# 模型1\n",
    "accuracy_score(y_pred_1, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.91      0.93      0.92        45\n",
      "           1       0.96      0.94      0.95        69\n",
      "\n",
      "    accuracy                           0.94       114\n",
      "   macro avg       0.93      0.94      0.94       114\n",
      "weighted avg       0.94      0.94      0.94       114\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(y_pred_1, y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9210526315789473"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 模型2\n",
    "accuracy_score(y_pred_2, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.89      0.91      0.90        45\n",
      "           1       0.94      0.93      0.93        69\n",
      "\n",
      "    accuracy                           0.92       114\n",
      "   macro avg       0.92      0.92      0.92       114\n",
      "weighted avg       0.92      0.92      0.92       114\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(y_pred_2, y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[42  4]\n",
      " [ 3 65]]\n"
     ]
    }
   ],
   "source": [
    "# 7 混淆矩阵\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "# 模型1\n",
    "cm = confusion_matrix(y_test, y_pred_1)\n",
    "\n",
    "print(cm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tn =  42\n",
      "fp =  4\n",
      "fn =  3\n",
      "tp =  65\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制结果\n",
    "categories  = ['Negative','Positive'] # 类别\n",
    "group_names = ['TN','FP', 'FN','TP'] # 显示标签\n",
    "\n",
    "tn, fp, fn, tp = cm.ravel()\n",
    "print(\"tn = \", tn)\n",
    "print(\"fp = \", fp)\n",
    "print(\"fn = \", fn)\n",
    "print(\"tp = \", tp)\n",
    "\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.heatmap(cm, annot=True, cmap = 'Blues', \n",
    "                xticklabels = categories, yticklabels = categories)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
